package com.mark.java.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * Created by gml on 17/2/28.
 */

public interface IBaseDao {

    //增加对应实体的一条记录
    public boolean save(Object o);

    //更新对应实体的一条记录
    public boolean update(Object o);

    //增加或者更新对应实体的一条记录
    public boolean saveOrUpdate(Object o);

    //保存一系列对象集合
    public boolean saveOrUpdateAll(Collection l);

    //删除对应实体的一条记录
    public boolean delete(Object o);

    //根据id删除对应实体的一条记录
    public boolean delete(Class c, Serializable id);

    //执行hql语句删除一条记录
    public Integer delete(String hql, Object... values);

    //删除一系列数据
    public boolean deleteAll(Collection l);

    //执行hql语句查找
    public List find(String hql);

    //分页查询，多参数条件
//    public List find(String hql, DataGridReq dgr, List values);
//
//    //分页查询，多参数条件
//    public List find(String hql, DataGridReq dgr, Object... values);

    //不带分页查询，多参数条件
    public List find(String hql, Object... values);

    //不带分页查询，多参数条件
    public boolean update(String hql, Object... values);

    //根据主键ID查询对应实体的一条记录
    public Object get(Class clazz, Serializable id);

    //获取某实体对象
    public Object load(Class c, Serializable id);

    //获取总记录数
    public Long total(String hql, List values);

    //获取总记录数
    public Long total(String hql, Object... values);

    //更新对应实体的某一条记录
    public boolean updateOneByProperty(Class clazz, Serializable id, String pName, Object pValue);

    //更新对应实体的某几条记录
    public boolean updateOneByPropertys(Class clazz, Serializable id, List<String> pName, List<Object> pValue);

    //更新对应实体的某几条记录(封装成map)
    public boolean updateOneByPropertys(Class clazz, Serializable id, Map<String, Object> map);

    //根据属性名以及对应的属性值查找一条记录
    public Object getSingleByProperty(Class clazz, String pName, Object pValue);

    //判断是否有对应的属性名和属性值存在，存在返回true
    public boolean ifHasOneByProperty(Class clazz, String pName, Object pValue);

    //根据一系列属性以及对应的属性值查询一条记录
    public Object getSingleByPropertys(Class clazz, List<String> pName, List<Object> pValue);

    //判断是否有一系列对应的属性名和属性值存在，存在返回true
    public boolean ifHasOneByPropertys(Class clazz, List<String> pName, List<Object> pValue);

    //根据一系列属性以及对应的属性值(封装成Map)查询一条记录
    public Object getSingleByPropertys(Class clazz, Map<String, Object> map);

    //判断是否有一系列对应的属性名和属性值(封装成Map)存在，存在返回true
    public boolean ifHasOneByPropertys(Class clazz, Map<String, Object> map);

    //通过某一对应的属性名和属性值，查询某一个属性的值
    public Object getValueByPropertys(Class clazz, Map<String, Object> map, String selectName);

    //通过一系列对应的属性名和属性值，查询某一个属性的值
    public Object getValueByProperty(Class clazz, String pName, Object pValue, String selectName);

    //通过一系列对应的属性名和属性值，查询某一个属性的值
    public Object getValueByPropertys(Class clazz, List<String> pNames, List<Object> pValues, String selectName);

    //查询对应实体的所有记录
    public List<Object> getObjects(Class clazz);

    //查询符合属性名以及对应的属性值的一系列记录
    public List<Object> getObjectsByProperty(Class clazz, String pName, Object pValue);

    //根据任意属性查询名以及对应的属性值的一系列记录
    public List<Object> getObjectsByAnyProperty(Class clazz, List<String> pName, List<Object> pValue);

    //查询符合一系列属性名以及对应的属性值的一系列记录
    public List<Object> getObjectsByPropertys(Class clazz, List<String> pName, List<Object> pValue);

    //根据某属性对应的属性值在某一范围内的一系列记录
    public List<Object> getObjectsByProperty(Class clazz, String pName, String operator, Object pValue);

    //根据某属性对应的属性值在某一范围内的一系列记录
    public List<Object> getObjectsByPropertys(Class clazz, List<String> pName, List<String> operator, List<Object> pValue);
}